Quando o assunto é aviação civil e transporte aéreo, vários eventos ou intercorrências podem ocorrer pelo percurso. Formalmente falando, esses eventos podem ser chamados de ocorrências aeronáuticas.
Ocorrência aeronáutica é qualquer evento envolvendo aeronave que poderá ser classificado como incidente, incidente grave ou acidente (link), permitindo ao SIPAER (Sistema de Investigação e Prevenção de Acidentes Aeronáuticos) a adoção dos procedimentos pertinentes.
Dadas essas possíveis classificações de uma ocorrência aeronáutica, é importante conhecer fatores que estão associados a ocorrências aeronáuticas perigosas com objetivos de prevenção.
Gládio - Símbolo da Força Aérea Brasileira
O trabalho consiste em gerar documentos (relatórios e apresentação) resultantes da exploração da base de dados “Ocorrências Aeronáuticas na Aviação Civil Brasileira”
A base de dados é composta por 5 tabelas que são gerenciadas pelo Centro de Investigação e Prevenção de Acidentes Aeronáuticos (CENIPA) - Organização Militar Brasileira vinculada ao Comando da Aeronáutica
Para obter as tabelas, consulte o link: https://dados.gov.br/dataset/ocorrencias-aeronauticas-da-aviacao-civil-brasileira
As tabelas têm informações sobre: aeronaves envolvidas, fatalidades, local, data, tipo de ocorrência, fatores contribuintes, etc.
Tabelas das ocorrências aeronáuticas
O nome das tabelas são: OCORRÊNCIA, OCORRÊNCIA_TIPO, AERONAVE, FATOR_CONTRIBUINTE E RECOMENDAÇÃO. Para a realização desse teste, deu-se ênfase às tabelas OCORRÊNCIA e OCORRÊNCIA_TIPO.
Fluxo de trabalho em Estatística e Ciência de Dados
Alguns pacotes da linguagem R
Os dados foram obtidos das tabelas baixadas por meio do site mencionado acima, tratados inicialmente com a linguagem R (base, utils, tibble, dplyr), posteriormente importados para um banco de dados (DBI e RPostgres), analisados através de recursos de estatística descritiva como tabelas e gráficos (base, utils, tibble, dplyr, ggplot2, plotly, highcharter), e finalmente, um relatório (rmarkdown) e uma apresentação (xaringan) foram gerados.
#install.packages("box")
box::use(
######## Pacotes básicos
meth = methods,
ds = datasets,
ut = utils,
grD = grDevices,
gph = graphics,
sta = stats,
grid
)
######## Pacotes adicionais
library(magrittr) # pipe
box::use(
mg = magrittr,
rdr = readr,
tb = tibble,
dp = dplyr,
ti = tidyr,
fc = forcats,
stg = stringr,
gg = ggplot2,
# hc = highcharter,
geobr,
pl = plotly,
dbi = DBI,
rp = RPostgres,
kn = knitr,
hw = htmlwidgets,
wb = webshot
)
endereco_dados <- "../2.Dados_e_recursos/1.Datasets/"
endereco_imagens <- "imagens/"
endereco_graficos_estaticos <- "graficos_estaticos/"
endereco_graficos_interativos <- "graficos_interativos/"
endereco_funcoes_auxiliares <- "funcoes_auxiliares/"
source(paste0(endereco_funcoes_auxiliares,'tabela_metadados.R'),encoding="UTF-8")
source(paste0(endereco_funcoes_auxiliares,'funcoes_analiseunivariada.R'),encoding="UTF-8")
source(paste0(endereco_funcoes_auxiliares,'funcoes_analisebivariada.R'),encoding="UTF-8")
source(paste0(endereco_funcoes_auxiliares,'arruma_grafico_plotly.R'),encoding="UTF-8")
source(paste0(endereco_funcoes_auxiliares,'salva_grafico.R'), encoding = "UTF-8")
source(paste0(endereco_funcoes_auxiliares,'leitura_grafico.R'), encoding = "UTF-8")
ocorrencia.1 <- ut$read.csv2(file=paste0(endereco_dados,"originais/1.ocorrencia.csv"),
fileEncoding = 'UTF-8-BOM') %>%
tb$as_tibble()
ocorrencia.1 %>% dim()
## [1] 5167 22
ocorrencia.1 <- ocorrencia.1 %>%
dp$select(-('codigo_ocorrencia1':'codigo_ocorrencia4')) %>%
dp$mutate(divulgacao_dia_publicacao = ifelse(divulgacao_dia_publicacao == "NULL",
NA,divulgacao_dia_publicacao),
ocorrencia_hora = ifelse(ocorrencia_hora == "NULL",
NA,ocorrencia_hora))
ocorrencia.1 %>% dim()
## [1] 5167 18
ocorrencia.1 %>% str()
## tibble [5,167 × 18] (S3: tbl_df/tbl/data.frame)
## $ codigo_ocorrencia : int [1:5167] 52242 45331 45333 45401 45407 52243 50713 45334 45391 52244 ...
## $ ocorrencia_classificacao : chr [1:5167] "INCIDENTE" "ACIDENTE" "ACIDENTE" "ACIDENTE" ...
## $ ocorrencia_latitude : chr [1:5167] "" "-23.4355555556" "***" "***" ...
## $ ocorrencia_longitude : chr [1:5167] "" "-46.4730555556" "***" "***" ...
## $ ocorrencia_cidade : chr [1:5167] "PORTO ALEGRE" "GUARULHOS" "VIAMÃO" "SÃO SEBASTIÃO" ...
## $ ocorrencia_uf : chr [1:5167] "RS" "SP" "RS" "SP" ...
## $ ocorrencia_pais : chr [1:5167] "BRASIL" "BRASIL" "BRASIL" "BRASIL" ...
## $ ocorrencia_aerodromo : chr [1:5167] "SBPA" "SBGR" "****" "****" ...
## $ ocorrencia_dia : chr [1:5167] "05/01/2012" "06/01/2012" "06/01/2012" "06/01/2012" ...
## $ ocorrencia_hora : chr [1:5167] "20:27:00" "13:44:00" "13:00:00" "17:00:00" ...
## $ investigacao_aeronave_liberada: chr [1:5167] "***" "SIM" "NULL" "***" ...
## $ investigacao_status : chr [1:5167] "FINALIZADA" "FINALIZADA" "FINALIZADA" "NULL" ...
## $ divulgacao_relatorio_numero : chr [1:5167] "***" "A-582/CENIPA/2014" "A-070/CENIPA/2013" "NULL" ...
## $ divulgacao_relatorio_publicado: chr [1:5167] "NÃO" "SIM" "SIM" "NÃO" ...
## $ divulgacao_dia_publicacao : chr [1:5167] NA "2016-09-01" "2013-11-27" NA ...
## $ total_recomendacoes : int [1:5167] 0 3 0 0 0 0 0 0 0 0 ...
## $ total_aeronaves_envolvidas : int [1:5167] 1 1 1 1 1 1 1 1 1 1 ...
## $ ocorrencia_saida_pista : chr [1:5167] "NÃO" "NÃO" "NÃO" "NÃO" ...
ut$write.table(x = ocorrencia.1,
file = paste0(endereco_dados,"final/","1.ocorrencia.csv"),
sep = ";",
row.names = FALSE,
fileEncoding = 'UTF-8')
ocorrencia_tipo.2 <- ut$read.csv2(file=paste0(endereco_dados,"originais/2.ocorrencia_tipo.csv"),
fileEncoding = 'UTF-8-BOM') %>%
tb$as_tibble() %>% dp$rename("codigo_ocorrencia" = "codigo_ocorrencia1")
#ocorrencia_tipo.2 %>% dim()
ocorrencia_tipo <- ocorrencia_tipo.2 %>%
dp$select('ocorrencia_tipo') %>%
dp$distinct() %>%
dp$mutate("codigo_ocorrencia_tipo" = 1:dp$n(),
.before = "ocorrencia_tipo")
ocorrencia_tipo %>% dim()
## [1] 81 2
ocorrencia_tipo %>% str()
## tibble [81 × 2] (S3: tbl_df/tbl/data.frame)
## $ codigo_ocorrencia_tipo: int [1:81] 1 2 3 4 5 6 7 8 9 10 ...
## $ ocorrencia_tipo : chr [1:81] "COM PESSOAL EM VOO" "PERDA DE CONTROLE NO SOLO" "FALHA DO MOTOR EM VOO" "ESTOURO DE PNEU" ...
ut$write.table(x = ocorrencia_tipo,
file = paste0(endereco_dados,"final/","2.ocorrencia_tipo.csv"),
sep = ";",
row.names = FALSE,
fileEncoding = 'UTF-8')
Como o relacionamento entre as tabelas ocorrencia e ocorrenciatipo é de cardiladidade N:N e os dados posteriormente foram inseridos em um banco de dados, é considerado uma boa prática no mapeamento MER-MR (Modelo Entidade Relacionamento para Modelo Relacional) criar uma tabela de relacionamento.
ocorrencia_ocorrencia_tipo <- dp$left_join(
x = ocorrencia_tipo.2,
y = ocorrencia_tipo,
by = "ocorrencia_tipo"
) %>%
dp$relocate("codigo_ocorrencia_tipo", .before = "ocorrencia_tipo") %>%
dp$select("codigo_ocorrencia", "codigo_ocorrencia_tipo")
ocorrencia_ocorrencia_tipo %>% dim()
## [1] 5347 2
ocorrencia_ocorrencia_tipo %>% str()
## tibble [5,347 × 2] (S3: tbl_df/tbl/data.frame)
## $ codigo_ocorrencia : int [1:5347] 45331 45332 45333 45334 45390 45391 45392 45393 45393 45396 ...
## $ codigo_ocorrencia_tipo: int [1:5347] 1 2 3 4 5 3 6 7 2 8 ...
ut$write.table(x = ocorrencia_ocorrencia_tipo,
file = paste0(endereco_dados,"final/","2.ocorrencia_ocorrencia_tipo.csv"),
sep = ";",
row.names = FALSE,
fileEncoding = 'UTF-8')
############# Criação de banco de dados: ocorrencias
# sudo service postgresql start
# library(DBI)
# library(RPostgres)
con <- dbi$dbConnect(rp$Postgres(),
host = "localhost",
user = "postgres",
password = "123",
port = 5432,
dbname = "postgres")
# usar para gerar relatório novamente
try(dbi$dbExecute(con, "select pg_terminate_backend(pid)
from pg_stat_activity
where datname = 'ocorrencias';"))
try(dbi$dbExecute(con, "DROP DATABASE ocorrencias;"))
dbi$dbExecute(con, "CREATE DATABASE ocorrencias;")
con <- dbi$dbConnect(rp$Postgres(),
user = "postgres",
password = "123",
host = "localhost",
port = 5432,
dbname = "ocorrencias")
############# Criação de tabelas principais (ocorrencia e ocorrenciatipo)
# dbi$dbExecute(con, "CREATE SCHEMA public;")
# dbi$dbExecute(con, "DROP TABLE ocorrencia;")
dbi$dbExecute(con, "CREATE TABLE ocorrencia (
codigo_ocorrencia INTEGER not null,
ocorrencia_classificacao VARCHAR(25) not null,
ocorrencia_latitude VARCHAR(20),
ocorrencia_longitude VARCHAR(20),
ocorrencia_cidade VARCHAR(60) not null,
ocorrencia_uf VARCHAR(5) not null,
ocorrencia_pais VARCHAR(40) not null,
ocorrencia_aerodromo VARCHAR(5),
ocorrencia_dia date not null,
ocorrencia_hora time,
investigacao_aeronave_liberada VARCHAR(5),
investigacao_status VARCHAR(20),
divulgacao_relatorio_numero VARCHAR(60),
divulgacao_relatorio_publicado VARCHAR(5),
divulgacao_dia_publicacao date,
total_recomendacoes integer,
total_aeronaves_envolvidas integer not null,
ocorrencia_saida_pista VARCHAR(5),
CONSTRAINT ocorrencia_pk PRIMARY KEY (codigo_ocorrencia)
);")
# dbi$dbExecute(con, "DROP TABLE ocorrenciatipo;")
dbi$dbExecute(con,
"CREATE TABLE ocorrenciatipo (
codigo_ocorrencia_tipo INTEGER not null,
ocorrencia_tipo VARCHAR(120) not null,
CONSTRAINT ocorrenciatipo_pk PRIMARY KEY (codigo_ocorrencia_tipo)
);
"
)
############# Criação de tabela de relacionamento (ocorrencia_ocorrenciatipo)
## relações entre as tabelas
# dbi$dbExecute(con, "DROP TABLE ocorrencia_ocorrenciatipo;")
dbi$dbExecute(con,"CREATE TABLE ocorrencia_ocorrenciatipo (
codigo_ocorrencia INTEGER not null,
codigo_ocorrencia_tipo INTEGER not null
);
"
)
###### Inserir dados no banco de dados
############# Tabelas principais (ocorrencia e ocorrenciatipo)
# alterar formato de data de mdy para dmy
dbi$dbGetQuery(con,"show datestyle;")
dbi$dbGetQuery(con,"set datestyle = euro;")
dbi$dbGetQuery(con,"show datestyle;")
dbi$dbExecute(con,paste0("COPY ocorrencia(codigo_ocorrencia,
ocorrencia_classificacao,
ocorrencia_latitude,
ocorrencia_longitude,
ocorrencia_cidade,
ocorrencia_uf,
ocorrencia_pais,
ocorrencia_aerodromo,
ocorrencia_dia,
ocorrencia_hora,
investigacao_aeronave_liberada,
investigacao_status,
divulgacao_relatorio_numero,
divulgacao_relatorio_publicado,
divulgacao_dia_publicacao,
total_recomendacoes,
total_aeronaves_envolvidas,
ocorrencia_saida_pista)
FROM ",paste0("'",
normalizePath(endereco_dados,
winslash = "/"),
"/final/"),"1.ocorrencia.csv'
WITH DELIMITER ';'
CSV
HEADER
NULL AS 'NA'
ENCODING 'UTF8';
"))
dbi$dbExecute(con,paste0("COPY ocorrenciatipo (
codigo_ocorrencia_tipo,
ocorrencia_tipo)
FROM ",paste0("'",
normalizePath(endereco_dados,
winslash = "/"),
"/final/"),"2.ocorrencia_tipo.csv'
WITH DELIMITER ';'
CSV
HEADER
NULL AS 'NA'
ENCODING 'UTF8';
"))
############# Tabela de relacionamento (ocorrencia_ocorrencia_tipo)
dbi$dbExecute(con,paste0("COPY ocorrencia_ocorrenciatipo (
codigo_ocorrencia,
codigo_ocorrencia_tipo)
FROM ",paste0("'",
normalizePath(endereco_dados,
winslash = "/"),
"/final/"),"2.ocorrencia_ocorrencia_tipo.csv'
WITH DELIMITER ';'
CSV
HEADER
NULL AS 'NA'
ENCODING 'UTF8';
"))
As ocorrências aeronáuticas são classificadas em três categorias: Incidente, Incidente grave e Acidente
Incidente é toda ocorrência que não chega a se caracterizar como um acidente mas que afeta ou possa afetar a segurança da operação.
Incidente grave é um incidente que ocorre sob circunstâncias em que um acidente quase ocorreu.
Acidente é uma ocorrência tal que qualquer pessoa sofra lesão grave ou morra.
#source('funcoes_auxiliares/funcoes_analiseunivariada.R',encoding="UTF-8")
p_ocor_classif <- calcula_tab_frequencia_dplyr(
tabela_de_entrada = ocorrencia,
nome_variavel = `ocorrencia_classificacao`,
specific_order = c("ACIDENTE","INCIDENTE GRAVE", "INCIDENTE")
)
p_ocor_classif$`Category` <- p_ocor_classif$`Category` %>% fc$fct_inorder()
if (kn$is_html_output()) {
p_ocor_classif
} else {
p_ocor_classif %>% kn$kable()
}
#################################################################### Cria gráfico
#source('funcoes_auxiliares/funcoes_analiseunivariada.R',encoding="UTF-8")
ggplot2_p_ocor_classif <- grafico_tab_frequencia(
table_count_prop = p_ocor_classif,
nome_variavel = "Category",
cor_grafico = "#77C6D9",
hjust_e = -0.17,
hjust_d = 0.15,
size = 4.5,
tx1 = 0.05,
tx2 = 1,
xlab = "Classificação das ocorrências aeronáuticas",
ylab = "N° de ocorrências aeronáuticas"
)
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_p_ocor_classif)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_p_ocor_classif)
Apesar de incidentes (~ 54.4%) ocorrerem mais do que incidentes graves ou acidentes (~ 45.6%), este último número ainda é preocupante. O ideal é que se tenha uma porcentagem mais baixa de incidentes graves e acidentes pois essas são mais danosas.
#source('funcoes_auxiliares/funcoes_analiseunivariada.R',encoding="UTF-8")
p_ocor_ano <- calcula_tab_frequencia_dplyr(
tabela_de_entrada = (ocorrencia %>%
dp$mutate(`ocorrencia_ano` = dp$sql("DATE_PART('year', ocorrencia_dia)"))
),
nome_variavel = `ocorrencia_ano`,
specific_order = (ocorrencia %>%
dp$mutate(`ocorrencia_ano` = dp$sql("DATE_PART('year', ocorrencia_dia)")) %>%
dp$pull(`ocorrencia_ano`) %>%
unique() %>% sort())
)
if (kn$is_html_output()) {
p_ocor_ano
} else {
p_ocor_ano %>% kn$kable()
}
#################################################################### Cria gráfico
p_ocor_ano[["Category"]] <- as.factor(p_ocor_ano[["Category"]])
ggplot2_p_ocor_ano <- gg$ggplot(gg$aes(
x = Category,
y = Frequency,
group = 1
), data = p_ocor_ano) +
gg$geom_point(colour='#022634') +
gg$geom_line(colour='#022634') +
gg$geom_text(gg$aes(label=paste0(round(Percentage,2),'%'),
y=Frequency+0.035*min(Frequency))) +
gg$xlab('Ano') +
gg$ylab('N° de ocorrências aeronáuticas') +
gg$theme_classic()
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_p_ocor_ano)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_p_ocor_ano)
É possível perceber que o número absoluto de ocorrências aeronáuticas teve uma queda até o ano de 2016 e voltou a subir a partir desse ano.
ocorrencia_aux <- ocorrencia %>%
dp$mutate(`ocorrencia_ano` = dp$sql("DATE_PART('year', ocorrencia_dia)"))
p_ocor_ano_classif <- calcula_tab_frequencia_bivariada_dplyr(ocorrencia_aux,
`ocorrencia_ano`,
`ocorrencia_classificacao`)
if (kn$is_html_output()) {
p_ocor_ano_classif
} else {
p_ocor_ano_classif %>% kn$kable()
}
#################################################################### Cria gráfico
# p_ocor_ano_classif[["ocorrencia_ano"]] <-
# as.factor(p_ocor_ano_classif[["ocorrencia_ano"]])
# p_ocor_ano_classif[, "ocorrencia_classificacao"] <-
# factor(p_ocor_ano_classif[, "ocorrencia_classificacao"],
# levels=c("ACIDENTE","INCIDENTE GRAVE", "INCIDENTE"))
ggplot2_ocor_ano_classif <- gg$ggplot(
gg$aes(
x = ocorrencia_ano,
y = Frequency,
colour = ocorrencia_classificacao,
group = ocorrencia_classificacao
),
data = p_ocor_ano_classif
) +
gg$geom_point() +
gg$geom_line() +
gg$ylab('N° de ocorrências aeronáuticas') +
gg$scale_fill_discrete(name = "Classificação das ocorrências aeronáuticas") +
gg$theme_classic() +
gg$geom_text(gg$aes(label = paste0(round(Percentage, 1), "%"),
y = as.numeric(Frequency) + 20)) +
gg$labs(color='Classificação das ocorr. aeron.') +
gg$theme(legend.position="top") +
gg$expand_limits(y = max(p_ocor_ano_classif[['Frequency']]) * 1.2) +
gg$scale_x_continuous(
name="Ano",
labels = as.character(unique(p_ocor_ano_classif$ocorrencia_ano)),
breaks = unique(p_ocor_ano_classif$ocorrencia_ano)
)
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_ocor_ano_classif)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_ocor_ano_classif)
ggplot2_ocor_ano_classif_lm <- ggplot2_ocor_ano_classif
ggplot2_ocor_ano_classif_lm$layers[[2]] <- NULL # remove gg$geom_line()
ggplot2_ocor_ano_classif_lm <- ggplot2_ocor_ano_classif_lm +
gg$geom_smooth(data = p_ocor_ano_classif[p_ocor_ano_classif$ocorrencia_ano <= 2016, ],
method = sta$lm,
se = F,lwd=0.5) + # acrescenta regressão linear por partes (Ano <= 2016)
gg$geom_smooth(data = p_ocor_ano_classif[p_ocor_ano_classif$ocorrencia_ano > 2016,],
method = sta$lm,
se = F,lwd=0.5) # acrescenta regressão linear por partes (Ano > 2016)
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_ocor_ano_classif_lm)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_ocor_ano_classif_lm)
Nota-se que a tendência geral do número absoluto de ocorrências aeronáuticas também ocorre nas ocorrências de classificação do tipo “INCIDENTE” e em menor grau na classificação do tipo “INCIDENTE GRAVE”, ou seja, há presença de tendência de baixa até 2016 e de alta após o mesmo ano. Comportamento diferente é observado na tendência do número de ocorrências aeronáuticas com classificação do tipo “ACIDENTE” que se manteve em queda desde 2012. Além disso, é importante ressaltar que as somas das frequências relativas de “ACIDENTES” e “INCIDENTES GRAVES” ao longo dos anos variaram com valores mínimo e máximo iguais à 41% em 2013 e 55.2% em 2018, respectivamente.
p_ocor_uf <- calcula_tab_frequencia_dplyr(
tabela_de_entrada = ocorrencia,
nome_variavel = `ocorrencia_uf`
)
p_ocor_uf[,'Category'] <- as.character(p_ocor_uf[,'Category'],2)
p_ocor_uf[,'Percentage'] <- round(p_ocor_uf[,'Percentage'],2)
p_ocor_uf <- p_ocor_uf[order(p_ocor_uf[,'Frequency'],decreasing = TRUE),]
if (kn$is_html_output()) {
p_ocor_uf
} else {
p_ocor_uf %>% kn$kable()
}
# trocar gráfico de highcharter por outro pacote
# se der erro parecido com:
# Error: parse error: trailing garbage
# [2804,4640],[2713,4570]]]}}]};
# (right here) ------^
# instalar pacote com remotes::install_github("jbkunst/highcharter")
# e tentar novamente
#remotes::install_github("jbkunst/highcharter")
#library(highcharter)
# if (file.exists(paste0(endereco_graficos_interativos, "map.rds"))) {
# map <- readRDS(file = paste0(endereco_graficos_interativos, "map.rds"))
# } else {
# map <- hc$get_data_from_map(hc$download_map_data("countries/br/br-all"))
# }
#
# if (file.exists(paste0(endereco_graficos_interativos, "map2.rds"))) {
# map2 <- readRDS(file = paste0(endereco_graficos_interativos, "map2.rds"))
# } else {
# map2 <- hc$download_map_data("countries/br/br-all")
# }
# saveRDS(
# map,
# file = paste0(
# endereco_graficos_interativos,
# "map.rds"
# )
# )
# saveRDS(
# map2,
# file = paste0(
# endereco_graficos_interativos,
# "map2.rds"
# )
# )
# dados <- map[,c("woe-name","hc-a2")] %>%
# dp$left_join(x=.,y=p_ocor_uf, by = c("hc-a2" = "Category"))
# plot <- hc$highchart(type = "map") %>%
# #hc$hc_plotOptions(series = list(animation = FALSE)) %>%
# hc$hc_add_series_map(map = map2,
# df = dados,
# value = "Frequency",
# joinBy = "hc-a2",
# dataLabels = list(
# enabled = TRUE,
# format = "{point.hc-a2}"
# )) %>%
# hc$hc_tooltip(
# useHTML = TRUE, headerFormat = "",
# pointFormat = "{point.name} - {point.value} ({point.Percentage}%)"
# ) %>%
# hc$hc_title(text = "Ocorrências aeronáuticas por unidade federativa")
#
#
#
# hw$saveWidget(widget = plot, file = paste0(endereco_imagens,"plot.html"))
# if (kn$is_html_output()) {
# plot
# } else {
# instalar phantomjs se gráfico não ser gerado em pdf
# webshot::install_phantomjs(force=T)
# e também
# Sys.setenv(OPENSSL_CONF="/dev/null")
# webshot::webshot(url = paste0(endereco_imagens,"plot.html"),
# file =paste0(endereco_imagens,"plot.png"),
# delay = 0.2,
# zoom=1.5)
# }
# # plot aqui
#
# saveRDS(plot,
# file = paste0(endereco_graficos_interativos,
# substitute(plot),
# ".rds"))
if (file.exists(paste0(endereco_graficos_interativos, "map_gbr.rds"))) {
map_gbr <- readRDS(file = paste0(endereco_graficos_interativos, "map_gbr.rds"))
} else {
map_gbr <- geobr::read_state(year = 2019,showProgress = FALSE)
saveRDS(map_gbr, file = paste0(endereco_graficos_interativos, "map.rds"))
}
dados_uf <- dp$left_join(x=dp$rename(map_gbr,UF=abbrev_state),
y=p_ocor_uf,
by = c("UF" = "Category"))
plot_geobr <- gg$ggplot(data=dados_uf) +
gg$geom_sf(gg$aes(fill=Frequency)) +
gg$labs(title="Ocorrências aeronáuticas por unidade federativa", size=8) +
gg$scale_fill_distiller(palette = "OrRd",
name="Frequência",
limits = c(0,max(dados_uf$Frequency)),
direction = 1) + # reverse colors (1 option)
gg$theme_minimal() +
gg$theme(axis.title=gg$element_blank(),
axis.text=gg$element_blank(),
axis.ticks=gg$element_blank()) +
gg$geom_sf_text(gg$aes(text=paste0("n: ",
Frequency,
" (",Percentage,"%)"),
label=UF),size=2.5)
#
# #################################################################### Salva gráfico
#
# #source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = plot_geobr, arruma_graf_plotly=F)
#
# #################################################################### Leitura gráfico
#
# #source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = plot_geobr)
p_ocor_uf_classif <- calcula_tab_frequencia_bivariada_dplyr(ocorrencia_aux,
`ocorrencia_uf`,
`ocorrencia_classificacao`)
p_ocor_uf_classif <- p_ocor_uf_classif %>% dp$arrange(dplyr::desc(sum_Frequency))
p_ocor_uf_classif$`Percentage` <- round(p_ocor_uf_classif$`Percentage`,1)
p_ocor_uf_classif$`ocorrencia_uf` <- fc$fct_inorder(p_ocor_uf_classif$`ocorrencia_uf`)
if (kn$is_html_output()) {
p_ocor_uf_classif
} else {
p_ocor_uf_classif %>% kn$kable()
}
ggplot2_ocor_uf_classif1 <- grafico_tab_frequencia_bivariada2(
p_ocor_uf_classif,
"ocorrencia_classificacao",
"ocorrencia_uf",
tx1 = 0.6,
tx2 = 1.3,
size = 3,
legend = TRUE
) + gg$coord_cartesian(xlim = c(p_ocor_uf_classif[["ocorrencia_uf"]][1],
p_ocor_uf_classif[["ocorrencia_uf"]][15])) +
gg$scale_fill_discrete(name = "Classificação das ocorr. aeron.") +
gg$theme(legend.position="top") +
gg$ylab('N° de ocorrências aeronáuticas') +
gg$xlab('UF')
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_ocor_uf_classif1)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_ocor_uf_classif1)
ggplot2_ocor_uf_classif2 <- grafico_tab_frequencia_bivariada3(
p_ocor_uf_classif,
"ocorrencia_classificacao",
"ocorrencia_uf",
size = 2,
tx1 = 0.025,
tx2 = 0.00025,
legend=FALSE
) + gg$scale_fill_discrete(name = "Classificação das ocorr. aeron.") +
gg$theme(legend.position="top") +
gg$ylab('Proporção de ocorrências aeronáuticas') +
gg$xlab('UF')
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_ocor_uf_classif2, subir_eixo_y = T)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_ocor_uf_classif2)
Naturalmente, pelo fato de existir maior movimentação de aviões em estados de alta atividade econômica, esses mesmos têm as maiores quantidades de ocorrências. Porém, são os estados de MT(~56.9%), RR(~55.6%), e SE(~50%) que têm as maiores proporções de acidentes.
p_ocor_saida_pista <- calcula_tab_frequencia_dplyr(
tabela_de_entrada = ocorrencia,
nome_variavel = `ocorrencia_saida_pista`
)
if (kn$is_html_output()) {
p_ocor_saida_pista
} else {
p_ocor_saida_pista %>% kn$kable()
}
#################################################################### Cria gráfico
#source('funcoes_auxiliares/funcoes_analiseunivariada.R',encoding="UTF-8")
ggplot2_p_ocor_saida_pista <- grafico_tab_frequencia(
table_count_prop = p_ocor_saida_pista,
nome_variavel = "Category",
cor_grafico = "#77C6D9",
hjust_e = -0.17,
hjust_d = 0.15,
size = 4.5,
tx1 = 0.05,
tx2 = 1,
xlab = "Ocorrências aeronáuticas na saída de pista",
ylab = "N° de ocorrências aeronáuticas"
)
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_p_ocor_saida_pista)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_p_ocor_saida_pista)
p_ocor_saida_pista_classif <- calcula_tab_frequencia_bivariada_dplyr(ocorrencia,
`ocorrencia_saida_pista`,
`ocorrencia_classificacao`)
p_ocor_saida_pista_classif$`Percentage` <- round(p_ocor_saida_pista_classif$`Percentage`,1)
if (kn$is_html_output()) {
p_ocor_saida_pista_classif
} else {
p_ocor_saida_pista_classif %>% kn$kable()
}
ggplot2_ocor_saida_pista_classif1 <- grafico_tab_frequencia_bivariada2(
p_ocor_saida_pista_classif,
"ocorrencia_classificacao",
"ocorrencia_saida_pista",
tx1 = 0.3,
tx2 = 1.3,
size = 4,
legend = TRUE
) + gg$scale_fill_discrete(name = "Classificação das ocorr. aeron.") +
gg$theme(legend.position="top") +
gg$ylab('N° de ocorrências aeronáuticas') +
gg$xlab('Ocorrências aeronáuticas na saída de pista')
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_ocor_saida_pista_classif1)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_ocor_saida_pista_classif1)
ggplot2_ocor_saida_pista_classif2 <- grafico_tab_frequencia_bivariada3(
p_ocor_saida_pista_classif,
"ocorrencia_classificacao",
"ocorrencia_saida_pista",
size = 5,
tx1 = 0.025,
tx2 = 0.00025,
legend=FALSE
) + gg$scale_fill_discrete(name = "Classificação das ocorr. aeron.") +
gg$theme(legend.position="top") +
gg$ylab('Proporção de ocorrências aeronáuticas') +
gg$xlab('Ocorrências aeronáuticas na saída de pista')
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_ocor_saida_pista_classif2, subir_eixo_y = T)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_ocor_saida_pista_classif2)
Não se observa uma quantidade maior de ocorrências nas saídas de pista, porém a proporção de ocorrências classificadas como acidentes é maior quando se tem uma ocorrência na saída de pista (51.8% > 30.3%).
ocorrenciatipo <- dp$tbl(con, "ocorrenciatipo")
ocorrencia_ocorrenciatipo <- dp$tbl(con, "ocorrencia_ocorrenciatipo")
ocorrencia_ocorrenciatipo_aux <-
dp$left_join(x = ocorrencia_ocorrenciatipo,
y = ocorrenciatipo,
by = 'codigo_ocorrencia_tipo') %>%
dp$left_join(
x = .,
y = (
ocorrencia_ocorrenciatipo %>%
dp$select(codigo_ocorrencia) %>%
dp$group_by(codigo_ocorrencia) %>%
dp$summarise(codigo_ocorrencia_count = dplyr::n())
),
by = 'codigo_ocorrencia'
) %>%
dp$mutate(ocorrencia_tipo_new = ifelse(codigo_ocorrencia_count==1,
ocorrencia_tipo,
(ifelse(codigo_ocorrencia_count==2,
'2 TIPOS DE OCORRÊNCIA',
(ifelse(codigo_ocorrencia_count==3,
'3 TIPOS DE OCORRÊNCIA',
'NA')) )))) %>%
dp$select(codigo_ocorrencia, codigo_ocorrencia_tipo, ocorrencia_tipo, ocorrencia_tipo_new) %>%
as.data.frame()
ocorrencia_ocorrenciatipo_aux1.5 <-ocorrencia_ocorrenciatipo_aux %>% dp$select(codigo_ocorrencia,
ocorrencia_tipo_new) %>%
dp$distinct() %>% as.data.frame()
ocorrencia_ocorrenciatipo_aux2 <- ocorrencia %>%
as.data.frame() %>%
dp$select(codigo_ocorrencia, ocorrencia_classificacao) %>%
dp$left_join(
x = .,
y = ocorrencia_ocorrenciatipo_aux1.5,
by = 'codigo_ocorrencia'
)
p_ocor_ocorrencia_tipo_new <- calcula_tab_frequencia_dplyr(
tabela_de_entrada = ocorrencia_ocorrenciatipo_aux2,
nome_variavel = `ocorrencia_tipo_new`
)
p_ocor_ocorrencia_tipo_new <- p_ocor_ocorrencia_tipo_new %>% dp$arrange(dplyr::desc(Frequency))
p_ocor_ocorrencia_tipo_new$`Percentage` <- round(p_ocor_ocorrencia_tipo_new$`Percentage`,1)
p_ocor_ocorrencia_tipo_new[['Category']] <- factor(p_ocor_ocorrencia_tipo_new[['Category']],
levels=rev(p_ocor_ocorrencia_tipo_new[['Category']]))
if (kn$is_html_output()) {
p_ocor_ocorrencia_tipo_new
} else {
p_ocor_ocorrencia_tipo_new %>% kn$kable()
}
#################################################################### Cria gráfico
#source('funcoes_auxiliares/funcoes_analiseunivariada.R',encoding="UTF-8")
ggplot2_p_ocor_ocorrencia_tipo_new <- grafico_tab_frequencia2(
table_count_prop = p_ocor_ocorrencia_tipo_new,
nome_variavel = 'ocorrencia_tipo_new',
cor_grafico = '#77C6D9',
size = 5,
tx1 = 1.5,
tx2 = 1.2
)
ggplot2_p_ocor_ocorrencia_tipo_new <- ggplot2_p_ocor_ocorrencia_tipo_new +
gg$scale_x_discrete(
labels = function(x) {
is_long <- nchar(x) > 25
x[is_long] <- paste0(substr(x[is_long], 1, 25), ".")
x
}
) +
gg$coord_flip(xlim=c(p_ocor_ocorrencia_tipo_new[['Category']][1],
p_ocor_ocorrencia_tipo_new[['Category']][6])) +
gg$xlab('Tipo de ocorr. aeron.') +
gg$ylab('N° de ocorrências aeronáuticas')
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_p_ocor_ocorrencia_tipo_new)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_p_ocor_ocorrencia_tipo_new)
p_ocor_ocorrencia_tipo_new_classif <- calcula_tab_frequencia_bivariada_dplyr(ocorrencia_ocorrenciatipo_aux2,
`ocorrencia_tipo_new`,
`ocorrencia_classificacao`)
p_ocor_ocorrencia_tipo_new_classif <- p_ocor_ocorrencia_tipo_new_classif %>%
dp$arrange(match(`ocorrencia_tipo_new`, p_ocor_ocorrencia_tipo_new[['Category']]))
p_ocor_ocorrencia_tipo_new_classif$`Percentage` <- round(p_ocor_ocorrencia_tipo_new_classif$`Percentage`,1)
p_ocor_ocorrencia_tipo_new_classif[['ocorrencia_tipo_new']] <- fc$fct_rev(fc$fct_inorder(
p_ocor_ocorrencia_tipo_new_classif[['ocorrencia_tipo_new']])
)
if (kn$is_html_output()) {
p_ocor_ocorrencia_tipo_new_classif
} else {
p_ocor_ocorrencia_tipo_new_classif %>% kn$kable()
}
ggplot2_ocor_ocorrencia_tipo_new_classif1 <- grafico_tab_frequencia_bivariada2(
p_ocor_ocorrencia_tipo_new_classif,
"ocorrencia_classificacao",
"ocorrencia_tipo_new",
tx1 = 1.2,
tx2 = 1.3,
size = 3,
legend = TRUE
) + gg$scale_fill_discrete(name = "Classif. ocor. aeron.") +
gg$theme(legend.position="top") +
gg$coord_flip(xlim=c(p_ocor_ocorrencia_tipo_new_classif[['ocorrencia_tipo_new']][1],
p_ocor_ocorrencia_tipo_new_classif[['ocorrencia_tipo_new']][20])) +
gg$scale_x_discrete(
labels = function(x) {
is_long <- nchar(x) > 20
x[is_long] <- paste0(substr(x[is_long], 1, 20), ".")
x
}) +
gg$ylab("N° de ocorrências aeronáuticas") +
gg$xlab("Tipo de ocorr. aeron.")
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_ocor_ocorrencia_tipo_new_classif1, y=1.075)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_ocor_ocorrencia_tipo_new_classif1)
ggplot2_ocor_ocorrencia_tipo_new_classif2 <- grafico_tab_frequencia_bivariada3(
p_ocor_ocorrencia_tipo_new_classif,
"ocorrencia_classificacao",
"ocorrencia_tipo_new",
size = 2,
tx1 = 0.025,
tx2 = 0.00025,
legend=FALSE
) + gg$scale_fill_discrete(name = "Classif. ocor. aeron.") +
gg$theme(legend.position="top") +
gg$coord_flip(xlim=c(p_ocor_ocorrencia_tipo_new_classif[['ocorrencia_tipo_new']][1],
p_ocor_ocorrencia_tipo_new_classif[['ocorrencia_tipo_new']][20])) +
gg$scale_x_discrete(
labels = function(x) {
is_long <- nchar(x) > 20
x[is_long] <- paste0(substr(x[is_long], 1, 20), ".")
x
}) +
gg$ylab('Proporção de ocorrências aeronáuticas') +
gg$xlab('Tipo de ocorr. aeron.')
#
p_ocor_ocorrencia_tipo_new_classif3 <- p_ocor_ocorrencia_tipo_new_classif
aux <- p_ocor_ocorrencia_tipo_new_classif3 %>%
dp$filter(`ocorrencia_classificacao` == "ACIDENTE") %>%
dp$arrange(dplyr::desc(`Percentage`)) %>%
dp$pull(ocorrencia_tipo_new)
p_ocor_ocorrencia_tipo_new_classif3 <- p_ocor_ocorrencia_tipo_new_classif3 %>%
dplyr::arrange(match(`ocorrencia_tipo_new`, aux)) %>%
dp$mutate(`ocorrencia_tipo_new` = as.character(`ocorrencia_tipo_new`)) %>%
dp$mutate(`ocorrencia_tipo_new` = ifelse(`ocorrencia_tipo_new` == "", "NULL",
`ocorrencia_tipo_new`)) %>%
dp$mutate(`ocorrencia_tipo_new` = fc$fct_rev(fc$fct_inorder(`ocorrencia_tipo_new`)))
ggplot2_ocor_ocorrencia_tipo_new_classif3 <- grafico_tab_frequencia_bivariada3(
p_ocor_ocorrencia_tipo_new_classif3,
"ocorrencia_classificacao",
"ocorrencia_tipo_new",
size = 1.8,
tx1 = 0.025,
tx2 = 0.00025,
legend=FALSE
) + gg$scale_x_discrete(
labels = function(k) {
is_long <- nchar(k) > 19
k[is_long] <- paste0(substr(k[is_long], 1, 19), ".")
k
}
) +
gg$coord_flip(
xlim = c(
p_ocor_ocorrencia_tipo_new_classif3[['ocorrencia_tipo_new']][1],
p_ocor_ocorrencia_tipo_new_classif3[['ocorrencia_tipo_new']][30]
)
) +
gg$scale_fill_discrete(name = "Classif. ocor. aeron.") +
gg$theme(legend.position = "top") +
gg$ylab('Proporção de ocorrências aeronáuticas') +
gg$xlab('Tipo de ocorr. aeron.')
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_ocor_ocorrencia_tipo_new_classif2, y=1.14)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_ocor_ocorrencia_tipo_new_classif2)
#################################################################### Salva gráfico
#source('funcoes_auxiliares/salva_grafico.R', encoding = "UTF-8")
salva_grafico(ggplot2_grafico = ggplot2_ocor_ocorrencia_tipo_new_classif3, y=1.14)
#################################################################### Leitura gráfico
#source('funcoes_auxiliares/leitura_grafico.R', encoding = "UTF-8")
leitura_grafico(ggplot2_grafico = ggplot2_ocor_ocorrencia_tipo_new_classif3)
É possível observar que existem vários tipos de ocorrência, porém alguns tipos são mais propensos a serem classificados como acidentes, tais como: Perda de controle em voo, pane seca, operação a baixa altitude, etc.
Apesar de incidentes (~ 54.4%) ocorrerem mais do que incidentes graves ou acidentes (~ 45.6%), este último número ainda é preocupante. O ideal é que se tenha uma porcentagem mais baixa de incidentes graves e acidentes para que pessoas não sofram qualquer lesão corporal.
É possível perceber que o número absoluto de ocorrências aeronáuticas teve uma queda até o ano de 2016 e voltou a subir a partir desse ano. Nota-se que essa tendência também ocorre nas ocorrências de classificação do tipo “INCIDENTE” e em menor grau na classificação do tipo “INCIDENTE GRAVE”. Comportamento diferente é observado na tendência do número de ocorrências aeronáuticas com classificação do tipo “ACIDENTE” que se manteve em queda desde 2012. Além disso, é importante ressaltar que as somas das frequências relativas de “ACIDENTES” e “INCIDENTES GRAVES” ao longo dos anos variaram com valores mínimo e máximo iguais à 41% em 2013 e 55.2% em 2018, respectivamente.
Naturalmente, pelo fato de existir maior movimentação de aviões em estados de alta atividade econômica, esses mesmos têm as maiores quantidades de ocorrências. Porém, são os estados de MT(~56.9%), RR(~55.6%), e SE(~50%) que têm as maiores proporções de acidentes.
Não se observa uma quantidade maior de ocorrências nas saídas de pista, porém a proporção de ocorrências classificadas como acidentes é maior quando se tem uma ocorrência na saída de pista (51.8% > 30.3%).
É possível observar que existem vários tipos de ocorrência, porém alguns tipos são mais propensos a serem classificados como acidentes, tais como: Perda de controle em voo, pane seca, operação a baixa altitude, etc.